#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<string.h>
#include<errno.h>
//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    //子进程
//    int count = 5;
//    while(count--)
//    {
//      printf("我是一个子进程，我的pid是:%d,父进程ppid是:%d\n",getpid(),getppid());
//      sleep(1);
//    }
//    //int a = 100;
//    // a /= 0;
//     exit(1);
//  }
//  
//  //sleep(10);
//  //父进程
//  // int rid = wait(NULL);
//  int status = 0;
//  int rid = waitpid(id,&status,0);
//  if(rid > 0)
//  {
//    //等待成功
//    //printf("wait success pid->%d, exit code:%d,exit signal:%d\n",rid,(status>>8)&0xFF,status&0x7F);
//    if(WIFEXITED(status))
//      printf("wait success pid->%d, exit code:%d\n",rid,WEXITSTATUS(status));
//    else
//      printf("程序异常！！\n");
//  }
//  else
//  {
//    //等待失败
//    printf("wait failed %d -> %s",errno,strerror(errno));
//  }
//  //sleep(10);
//  return 0;
//}

//函数指针
typedef void (*func)();

#define NUM 3
func handlers[NUM+1];
void DownLoad()
{
  printf("下载任务\n");
}
void Flush()
{
  printf("刷新任务\n");
}
void registerhandlers(func h[],func f)
{
  int i = 0;
  for(i = 0; i < NUM; i++)
  {
    //数组为空返回
    if(h[i]==NULL)
      break;
  }
  //i == NUM 数组满了
  if(i == NUM)
    return;
  h[i] = f;
  h[i+1] = NULL;
}
int main()
{
  registerhandlers(handlers,DownLoad);
  registerhandlers(handlers,Flush);

  pid_t id = fork();
  if(id == 0)
  {
    //子进程
    while(1)
    {
      printf("我是一个子进程，我的pid是:%d,父进程ppid是:%d\n",getpid(),getppid());
      sleep(1);
    }
     exit(1);
  }
  
  //父进程
  while(1)
  {
   int status = 0;
   int rid = waitpid(id,&status,WNOHANG);
   if(rid > 0)
   {
     //等待成功
     //printf("wait success pid->%d, exit code:%d,exit signal:%d\n",rid,(status>>8)&0xFF,status&0x7F);
       printf("wait success pid->%d, exit code:%d\n",rid,WEXITSTATUS(status));
       break;
   }
   else if(rid == 0)
   {
     //执行其他任务
     int i = 0;
     for(i = 0; handlers[i]; i++)
     {
       handlers[i]();
     }
     printf("本轮调度完成，子进程未退出\n");
     sleep(1);
   }
   else
   {
     //等待失败
     printf("wait failed %d -> %s",errno,strerror(errno));
     break;
   }
   }
   //sleep(10);
   return 0;
} 
